modify message relative apis

Brightcells 9 years ago
parent
commit
165424743a

+ 3 - 4
api/urls.py

@@ -49,10 +49,9 @@ urlpatterns += [
49 49
 # 消息相关
50 50
 urlpatterns += [
51 51
     url(r'^msg/list$', message_views.message_list_api, name='message_list_api'),  # 消息列表
52
-    url(r'^msg/list/(?P<msg_type>\w+)$', message_views.message_type_list_api, name='message_type_list_api'),  # 分类消息列表
53
-    url(r'^msg/read$', message_views.message_read_api, name='message_read_api'),  # 消息读取
54
-    url(r'^msg/delete$', message_views.message_delete_api, name='message_delete_api'),  # 消息删除
55
-    url(r'^msg/delete/(?P<msg_type>\w+)$', message_views.message_delete_api, name='message_type_delete_api'),  # 消息删除
52
+    url(r'^msg/(?P<msg_type>\w+)/list$', message_views.message_type_list_api, name='message_type_list_api'),  # 分类消息列表
53
+    url(r'^msg/(?P<msg_type>\w+)/read$', message_views.message_type_read_api, name='message_type_read_api'),  # 消息读取
54
+    url(r'^msg/(?P<msg_type>\w+)/delete$', message_views.message_type_delete_api, name='message_type_delete_api'),  # 消息删除
56 55
 ]
57 56
 
58 57
 # 控制器相关

+ 19 - 1
message/admin.py

@@ -2,7 +2,7 @@
2 2
 
3 3
 from django.contrib import admin
4 4
 
5
-from message.models import UserMessageInfo
5
+from message.models import UserMessageInfo, SystemMessageInfo, SystemMessageReadInfo, SystemMessageDeleteInfo
6 6
 
7 7
 
8 8
 class UserMessageInfoAdmin(admin.ModelAdmin):
@@ -10,4 +10,22 @@ class UserMessageInfoAdmin(admin.ModelAdmin):
10 10
     list_filter = ('msg_type', 'read', 'status')
11 11
 
12 12
 
13
+class SystemMessageInfoAdmin(admin.ModelAdmin):
14
+    list_display = ('title', 'content', 'url', 'status', 'created_at', 'updated_at')
15
+    list_filter = ('status', )
16
+
17
+
18
+class SystemMessageReadInfoAdmin(admin.ModelAdmin):
19
+    list_display = ('user_id', 'msg_id', 'status', 'created_at', 'updated_at')
20
+    list_filter = ('status', )
21
+
22
+
23
+class SystemMessageDeleteInfoAdmin(admin.ModelAdmin):
24
+    list_display = ('user_id', 'msg_id', 'status', 'created_at', 'updated_at')
25
+    list_filter = ('status', )
26
+
27
+
13 28
 admin.site.register(UserMessageInfo, UserMessageInfoAdmin)
29
+admin.site.register(SystemMessageInfo, SystemMessageInfoAdmin)
30
+admin.site.register(SystemMessageReadInfo, SystemMessageReadInfoAdmin)
31
+admin.site.register(SystemMessageDeleteInfo, SystemMessageDeleteInfoAdmin)

+ 45 - 0
message/migrations/0003_systemmessageinfo_systemmessagereadinfo.py

@@ -0,0 +1,45 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.db import models, migrations
5
+
6
+
7
+class Migration(migrations.Migration):
8
+
9
+    dependencies = [
10
+        ('message', '0002_auto_20160120_1830'),
11
+    ]
12
+
13
+    operations = [
14
+        migrations.CreateModel(
15
+            name='SystemMessageInfo',
16
+            fields=[
17
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
18
+                ('status', models.BooleanField(default=True, help_text='\u72b6\u6001', db_index=True, verbose_name='status')),
19
+                ('created_at', models.DateTimeField(help_text='\u521b\u5efa\u65f6\u95f4', verbose_name='created_at', auto_now_add=True)),
20
+                ('updated_at', models.DateTimeField(help_text='\u66f4\u65b0\u65f6\u95f4', verbose_name='updated_at', auto_now=True)),
21
+                ('title', models.CharField(help_text='\u7cfb\u7edf\u6d88\u606f\u6807\u9898', max_length=255, verbose_name='title')),
22
+                ('content', models.TextField(help_text='\u7cfb\u7edf\u6d88\u606f\u5185\u5bb9', null=True, verbose_name='content', blank=True)),
23
+                ('url', models.CharField(help_text='\u7cfb\u7edf\u6d88\u606f\u94fe\u63a5', max_length=255, null=True, verbose_name='url', blank=True)),
24
+            ],
25
+            options={
26
+                'verbose_name': 'systemmessageinfo',
27
+                'verbose_name_plural': 'systemmessageinfo',
28
+            },
29
+        ),
30
+        migrations.CreateModel(
31
+            name='SystemMessageReadInfo',
32
+            fields=[
33
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
34
+                ('status', models.BooleanField(default=True, help_text='\u72b6\u6001', db_index=True, verbose_name='status')),
35
+                ('created_at', models.DateTimeField(help_text='\u521b\u5efa\u65f6\u95f4', verbose_name='created_at', auto_now_add=True)),
36
+                ('updated_at', models.DateTimeField(help_text='\u66f4\u65b0\u65f6\u95f4', verbose_name='updated_at', auto_now=True)),
37
+                ('user_id', models.CharField(max_length=255, blank=True, help_text='\u7528\u6237\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='user_id', db_index=True)),
38
+                ('msg_id', models.CharField(max_length=255, blank=True, help_text='\u7cfb\u7edf\u6d88\u606f\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='msg_id', db_index=True)),
39
+            ],
40
+            options={
41
+                'verbose_name': 'systemmessagereadinfo',
42
+                'verbose_name_plural': 'systemmessagereadinfo',
43
+            },
44
+        ),
45
+    ]

+ 29 - 0
message/migrations/0004_systemmessagedeleteinfo.py

@@ -0,0 +1,29 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.db import models, migrations
5
+
6
+
7
+class Migration(migrations.Migration):
8
+
9
+    dependencies = [
10
+        ('message', '0003_systemmessageinfo_systemmessagereadinfo'),
11
+    ]
12
+
13
+    operations = [
14
+        migrations.CreateModel(
15
+            name='SystemMessageDeleteInfo',
16
+            fields=[
17
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
18
+                ('status', models.BooleanField(default=True, help_text='\u72b6\u6001', db_index=True, verbose_name='status')),
19
+                ('created_at', models.DateTimeField(help_text='\u521b\u5efa\u65f6\u95f4', verbose_name='created_at', auto_now_add=True)),
20
+                ('updated_at', models.DateTimeField(help_text='\u66f4\u65b0\u65f6\u95f4', verbose_name='updated_at', auto_now=True)),
21
+                ('user_id', models.CharField(max_length=255, blank=True, help_text='\u7528\u6237\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='user_id', db_index=True)),
22
+                ('msg_id', models.CharField(max_length=255, blank=True, help_text='\u7cfb\u7edf\u6d88\u606f\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='msg_id', db_index=True)),
23
+            ],
24
+            options={
25
+                'verbose_name': 'systemmessagedeleteinfo',
26
+                'verbose_name_plural': 'systemmessagedeleteinfo',
27
+            },
28
+        ),
29
+    ]

+ 47 - 2
message/models.py

@@ -57,8 +57,7 @@ class UserMessageInfo(CreateUpdateMixin):
57 57
     def __unicode__(self):
58 58
         return unicode(self.pk)
59 59
 
60
-    @property
61
-    def msg_info(self):
60
+    def msg_info(self, user_id=None):
62 61
         try:
63 62
             group_photo = GroupPhotoInfo.objects.get(pk=self.photo_id)
64 63
         except GroupPhotoInfo.DoesNotExist:
@@ -79,3 +78,49 @@ class UserMessageInfo(CreateUpdateMixin):
79 78
             'read': self.read,
80 79
             'created_at': self.created_at.replace(microsecond=0),
81 80
         }
81
+
82
+
83
+class SystemMessageInfo(CreateUpdateMixin):
84
+    title = models.CharField(_(u'title'), max_length=255, help_text=u'系统消息标题')
85
+    content = models.TextField(_(u'content'), blank=True, null=True, help_text=u'系统消息内容')
86
+    url = models.CharField(_(u'url'), max_length=255, blank=True, null=True, help_text=u'系统消息链接')
87
+
88
+    class Meta:
89
+        verbose_name = _('systemmessageinfo')
90
+        verbose_name_plural = _('systemmessageinfo')
91
+
92
+    def __unicode__(self):
93
+        return unicode(self.pk)
94
+
95
+    def msg_info(self, user_id=None):
96
+        return {
97
+            'pk': self.pk,
98
+            'title': self.title,
99
+            'content': self.content,
100
+            'url': self.url,
101
+            'read': SystemMessageReadInfo.objects.filter(user_id=user_id, msg_id=self.pk).exists(),
102
+        }
103
+
104
+
105
+class SystemMessageReadInfo(CreateUpdateMixin):
106
+    user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
107
+    msg_id = models.CharField(_(u'msg_id'), max_length=255, blank=True, null=True, help_text=u'系统消息唯一标识', db_index=True)
108
+
109
+    class Meta:
110
+        verbose_name = _('systemmessagereadinfo')
111
+        verbose_name_plural = _('systemmessagereadinfo')
112
+
113
+    def __unicode__(self):
114
+        return unicode(self.pk)
115
+
116
+
117
+class SystemMessageDeleteInfo(CreateUpdateMixin):
118
+    user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
119
+    msg_id = models.CharField(_(u'msg_id'), max_length=255, blank=True, null=True, help_text=u'系统消息唯一标识', db_index=True)
120
+
121
+    class Meta:
122
+        verbose_name = _('systemmessagedeleteinfo')
123
+        verbose_name_plural = _('systemmessagedeleteinfo')
124
+
125
+    def __unicode__(self):
126
+        return unicode(self.pk)

+ 82 - 24
message/views.py

@@ -3,13 +3,16 @@
3 3
 from django.conf import settings
4 4
 from django.http import JsonResponse
5 5
 
6
-from message.models import UserMessageInfo
6
+from account.models import UserInfo
7
+from message.models import UserMessageInfo, SystemMessageInfo, SystemMessageReadInfo, SystemMessageDeleteInfo
7 8
 
8 9
 from utils.page_utils import pagination
9 10
 
10
-from utils.error.errno_utils import MessageStatusCode
11
+from utils.error.errno_utils import UserStatusCode, MessageStatusCode
11 12
 from utils.error.response_utils import response
12 13
 
14
+from utils.redis.rmessage import set_system_message_delete_info, get_system_message_delete_info
15
+
13 16
 
14 17
 def message_list_api(request):
15 18
     """
@@ -23,14 +26,24 @@ def message_list_api(request):
23 26
 
24 27
     final_messages = []
25 28
     for message in messages:
26
-        type_messages = UserMessageInfo.objects.filter(
27
-            to_uid=user_id,
28
-            msg_type=message['msg_type'],
29
-            status=True,
30
-        ).order_by(
29
+        msg_type = message['msg_type']
30
+        if msg_type == UserMessageInfo.SYSTEM:
31
+            deleted_message_ids = get_system_message_delete_info(user_id)
32
+            type_messages = SystemMessageInfo.objects.filter(
33
+                status=True,
34
+            ).exclude(
35
+                pk__in=deleted_message_ids,
36
+            )
37
+        else:
38
+            type_messages = UserMessageInfo.objects.filter(
39
+                to_uid=user_id,
40
+                msg_type=msg_type,
41
+                status=True,
42
+            )
43
+        type_messages = type_messages.order_by(
31 44
             '-pk'
32 45
         )[:settings.MESSAGE_NUM_PER_PAGE]
33
-        type_messages = [msg.msg_info for msg in type_messages]
46
+        type_messages = [msg.msg_info(user_id) for msg in type_messages]
34 47
         message['msg_list'] = type_messages
35 48
         final_messages.append(message)
36 49
 
@@ -54,15 +67,24 @@ def message_type_list_api(request, msg_type):
54 67
     page = int(request.POST.get('page', 0) or request.GET.get('page', 0) or 1)
55 68
     num = int(request.POST.get('num', 0) or request.GET.get('num', 0) or settings.MESSAGE_NUM_PER_PAGE)
56 69
 
57
-    type_messages = UserMessageInfo.objects.filter(
58
-        to_uid=user_id,
59
-        msg_type=msg_type,
60
-        status=True,
61
-    ).order_by(
70
+    if msg_type == UserMessageInfo.SYSTEM:
71
+        deleted_message_ids = get_system_message_delete_info(user_id)
72
+        type_messages = SystemMessageInfo.objects.filter(
73
+            status=True,
74
+        ).exclude(
75
+            pk__in=deleted_message_ids,
76
+        )
77
+    else:
78
+        type_messages = UserMessageInfo.objects.filter(
79
+            to_uid=user_id,
80
+            msg_type=msg_type,
81
+            status=True,
82
+        )
83
+    type_messages = type_messages.order_by(
62 84
         '-pk'
63 85
     )
64 86
     type_messages, left = pagination(type_messages, page, num)
65
-    type_messages = [msg.msg_info for msg in type_messages]
87
+    type_messages = [msg.msg_info(user_id) for msg in type_messages]
66 88
 
67 89
     return JsonResponse({
68 90
         'status': 200,
@@ -74,16 +96,35 @@ def message_type_list_api(request, msg_type):
74 96
     })
75 97
 
76 98
 
77
-def message_read_api(request):
99
+def message_type_read_api(request, msg_type=None):
78 100
     """
79 101
     消息读取
80 102
     :param request:
81 103
     :return:
82 104
     """
83
-    pk = int(request.POST.get('pk', 0) or request.GET.get('pk', 0) or -1)
84 105
     user_id = request.POST.get('user_id', '') or request.GET.get('user_id', '')
85
-
86
-    UserMessageInfo.objects.filter(pk=pk, to_uid=user_id).update(read=True)
106
+    pk = int(request.POST.get('pk', 0) or request.GET.get('pk', 0) or -1)
107
+    _all = request.POST.get('all', '') or request.GET.get('all', '')
108
+
109
+    # 用户校验
110
+    try:
111
+        user = UserInfo.objects.get(user_id=user_id)
112
+    except UserInfo.DoesNotExist:
113
+        return response(UserStatusCode.USER_NOT_FOUND)
114
+
115
+    if msg_type == UserMessageInfo.SYSTEM:
116
+        if pk > 0:  # 系统消息单个读取
117
+            if not SystemMessageInfo.objects.filter(pk=pk).exists():
118
+                return response(MessageStatusCode.MESSAGE_NOT_FOUND)
119
+            SystemMessageReadInfo.objects.get_or_create(user_id=user_id, msg_id=pk)
120
+        if _all:  # 系统消息全部读取
121
+            for msg in SystemMessageInfo.objects.filter(status=True):
122
+                SystemMessageReadInfo.objects.get_or_create(user_id=user_id, msg_id=msg.pk)
123
+    else:
124
+        if pk > 0:  # 用户(点赞/评论)消息单个读取
125
+            UserMessageInfo.objects.filter(pk=pk, to_uid=user_id).update(read=True)
126
+        if _all:  # 用户消息(点赞/评论)全部读取
127
+            UserMessageInfo.objects.filter(to_uid=user_id, msg_type=msg_type).update(read=True)
87 128
 
88 129
     return JsonResponse({
89 130
         'status': 200,
@@ -91,7 +132,7 @@ def message_read_api(request):
91 132
     })
92 133
 
93 134
 
94
-def message_delete_api(request, msg_type=None):
135
+def message_type_delete_api(request, msg_type=None):
95 136
     """
96 137
     消息删除
97 138
     :param request:
@@ -99,12 +140,29 @@ def message_delete_api(request, msg_type=None):
99 140
     :return:
100 141
     """
101 142
     user_id = request.POST.get('user_id', '') or request.GET.get('user_id', '')
102
-
103
-    if msg_type:
104
-        UserMessageInfo.objects.filter(to_uid=user_id, msg_type=msg_type).update(status=False)
143
+    pk = int(request.POST.get('pk', 0) or request.GET.get('pk', 0) or -1)
144
+    _all = request.POST.get('all', '') or request.GET.get('all', '')
145
+
146
+    # 用户校验
147
+    try:
148
+        user = UserInfo.objects.get(user_id=user_id)
149
+    except UserInfo.DoesNotExist:
150
+        return response(UserStatusCode.USER_NOT_FOUND)
151
+
152
+    if msg_type == UserMessageInfo.SYSTEM:
153
+        if pk > 0:  # 系统消息单个删除
154
+            if not SystemMessageInfo.objects.filter(pk=pk).exists():
155
+                return response(MessageStatusCode.MESSAGE_NOT_FOUND)
156
+            SystemMessageDeleteInfo.objects.get_or_create(user_id=user_id, msg_id=pk)
157
+        if _all:  # 系统消息全部删除
158
+            for msg in SystemMessageInfo.objects.filter(status=True):
159
+                SystemMessageDeleteInfo.objects.get_or_create(user_id=user_id, msg_id=msg.pk)
160
+        set_system_message_delete_info(user_id)
105 161
     else:
106
-        pk = int(request.POST.get('pk', 0) or request.GET.get('pk', 0) or -1)
107
-        UserMessageInfo.objects.filter(pk=pk, to_uid=user_id).update(status=False)
162
+        if pk > 0:  # 用户(点赞/评论)消息单个删除
163
+            UserMessageInfo.objects.filter(pk=pk, to_uid=user_id).update(status=False)
164
+        if _all:  # 用户消息(点赞/评论)全部删除
165
+            UserMessageInfo.objects.filter(to_uid=user_id, msg_type=msg_type).update(status=False)
108 166
 
109 167
     return JsonResponse({
110 168
         'status': 200,

+ 4 - 1
utils/redis/rkeys.py

@@ -1,7 +1,7 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3 3
 # 用户相关
4
-PROFILE_INFO = 'profile:info:%s'  # STRING,用户信息,uid
4
+PROFILE_INFO = 'profile:info:%s'  # STRING,用户信息,user_id
5 5
 
6 6
 # 群组相关
7 7
 GROUP_INFO = 'group:info:%s'  # STRING,群组信息,group_id
@@ -16,3 +16,6 @@ GROUP_USERS_QUIT_SET = 'group:users:quit:set:%s'  # SET,群组用户退出集
16 16
 
17 17
 # 群组照片相关
18 18
 GROUP_LAST_PHOTO_PK = 'group:last:photo:pk:%s'  # STRING,群组最后一张照片PK,group_id
19
+
20
+# 系统消息相关
21
+SYSTEM_MESSAGE_DELETED_INFO = 'system:message:deleted:info:%s'  # STRING,系统消息删除信息,user_id

+ 28 - 0
utils/redis/rmessage.py

@@ -0,0 +1,28 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from django.conf import settings
4
+
5
+from message.models import SystemMessageDeleteInfo
6
+
7
+from utils.redis.rkeys import SYSTEM_MESSAGE_DELETED_INFO
8
+
9
+import json
10
+
11
+
12
+r = settings.REDIS_CACHE
13
+
14
+
15
+# 系统消息相关
16
+
17
+
18
+def set_system_message_delete_info(user_id):
19
+    """ 设置系统消息删除信息 """
20
+    deleted_messages = SystemMessageDeleteInfo.objects.filter(user_id=user_id, status=True)
21
+    deleted_message_ids = [msg.msg_id for msg in deleted_messages]
22
+    r.set(SYSTEM_MESSAGE_DELETED_INFO % user_id, json.dumps(deleted_message_ids))
23
+    return deleted_message_ids
24
+
25
+
26
+def get_system_message_delete_info(user_id):
27
+    """ 获取系统消息删除信息 """
28
+    return json.loads(r.get(SYSTEM_MESSAGE_DELETED_INFO % user_id) or '[]') or set_system_message_delete_info(user_id)